// 在文件顶部添加axios导入
import axios from 'axios';

// 全局变量
let mediaRecorder = null;
let audioContext = null;
let mediaStream = null;
let audioProcessor = null;
let pcmData = [];

// 开始录音
export function startRecording() {
    return new Promise((resolve, reject) => {
        if (!('getUserMedia' in navigator.mediaDevices)) {
            reject(new Error('浏览器不支持麦克风采集功能'));
            return;
        }

        // 获取用户媒体设备（麦克风）
        navigator.mediaDevices.getUserMedia({
            audio: {
                echoCancellation: true,
                noiseSuppression: true,
                sampleRate: 16000
            }
        }).then(stream => {
            mediaStream = stream;

            // 创建音频上下文
            audioContext = new (window.AudioContext || window.webkitAudioContext)({
                sampleRate: 16000
            });

            // 创建麦克风输入节点
            const microphone = audioContext.createMediaStreamSource(mediaStream);

            // 创建音频处理器节点
            audioProcessor = audioContext.createScriptProcessor(4096, 1, 1);

            // 清空之前的PCM数据
            pcmData = [];

            // 音频处理回调函数
            audioProcessor.onaudioprocess = function (event) {
                // 获取输入音频数据（单声道）
                const inputData = event.inputBuffer.getChannelData(0);

                // 将Float32数据转换为16位PCM整数
                const int16Data = new Int16Array(inputData.length);
                for (let i = 0; i < inputData.length; i++) {
                    // 音频数据归一化并转换为16位整数
                    const s = Math.max(-1, Math.min(1, inputData[i]));
                    int16Data[i] = s < 0 ? s * 0x8000 : s * 0x7FFF;
                }

                // 存储PCM数据
                pcmData.push(...int16Data);
            };

            // 连接音频节点
            microphone.connect(audioProcessor);
            audioProcessor.connect(audioContext.destination);

            resolve();
        }).catch(error => {
            console.error('启动录音失败:', error);
            reject(error);
        });
    });
}

// 停止录音
export function stopRecording() {
    return new Promise((resolve, reject) => {
        try {
            // 停止音频处理
            if (audioProcessor) {
                audioProcessor.disconnect();
                audioProcessor.onaudioprocess = null;
                audioProcessor = null;
            }

            // 停止并关闭媒体流
            if (mediaStream) {
                mediaStream.getTracks().forEach(track => track.stop());
                mediaStream = null;
            }

            // 关闭音频上下文
            if (audioContext) {
                audioContext.close();
                audioContext = null;
            }

            // 返回录制的PCM数据
            resolve(pcmData);
        } catch (error) {
            console.error('停止录音失败:', error);
            reject(error);
        }
    });
}

// 修复保存音频到服务器函数
export async function saveAudioToServer(audioData, sessionId, userId) {
    try {
        // 生成唯一文件名
        const timestamp = Date.now();
        const fileName = `voice_chat_${timestamp}.pcm`;

        // 将Int16Array转换为Blob
        const blob = new Blob([new Int16Array(audioData)], {type: 'application/octet-stream'});

        const formData = new FormData();
        formData.append('audioFile', blob, fileName); // 修改字段名为audioFile并添加文件名
        formData.append('sessionId', sessionId);

        // 调用后端API上传音频
        const response = await axios.post('http://localhost:8080/user/ai/save-audio', formData, {
            timeout: 10000,
            headers: {
                'Content-Type': 'multipart/form-data'
            }
        });

        // 修复条件判断逻辑，与hlbt.html保持一致
        if (response.data.code !== 1 || !response.data.data) {
            throw new Error(response.data.message || '上传音频文件失败');
        }

        return response.data.data; // 返回文件路径
    } catch (error) {
        console.error('保存音频到服务器失败:', error);
        throw error;
    }
}

// 初始化音频上下文（如果需要单独使用）
export function initAudioContext() {
    if (!audioContext) {
        audioContext = new (window.AudioContext || window.webkitAudioContext)({
            sampleRate: 16000
        });
    }
    return audioContext;
}

// 清理音频资源
export function cleanupAudioResources() {
    if (audioProcessor) {
        audioProcessor.disconnect();
        audioProcessor.onaudioprocess = null;
        audioProcessor = null;
    }

    if (mediaStream) {
        mediaStream.getTracks().forEach(track => track.stop());
        mediaStream = null;
    }

    if (audioContext) {
        audioContext.close().then(() => {
            audioContext = null;
        });
    }

    pcmData = [];
}